package servidor;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import tela.Posicao;
import beans.I_RMI;
import beans.Pecas;

@SuppressWarnings("serial")
public class Logica extends UnicastRemoteObject implements I_RMI{
	private int [][] casas = new int [8][8];
	private int conectados = 0;
	private int jogadorVez = 1;
	private boolean desistiu = false;
	private boolean chequeMate = false;
	private boolean empateSolicitado = false;
	private boolean empateAceito = false;
	
	protected Logica() throws RemoteException {
		super();
		reiniciaCasas();
	}

	public int conectar() throws RemoteException {
		if(conectados < 2){
			conectados++;
			return conectados;
		}
		else return -1;		
	}

	@Override
	public int getJogador() throws RemoteException {
		// TODO Auto-generated method stub
		return jogadorVez;
	}
	
	public void reiniciaCasas(){ //deixa o tabuleiro no estado inicial;
		for(int i=0; i<8; i++)
			for(int j=0; j<8; j++)
				setPosicao(i,j,0);
		setPosicao(0,0,Pecas.P_TORRE);
		setPosicao(0,1,Pecas.P_CAVALO);
		setPosicao(0,2,Pecas.P_BISPO);
		setPosicao(0,4,Pecas.P_REI);
		setPosicao(0,3,Pecas.P_RAINHA);
		setPosicao(0,5,Pecas.P_BISPO);
		setPosicao(0,6,Pecas.P_CAVALO);
		setPosicao(0,7,Pecas.P_TORRE);
		for(int i=0; i<8;i++)
			setPosicao(1, i, Pecas.P_PEAO);
		
		setPosicao(7,0,Pecas.B_TORRE);
		setPosicao(7,1,Pecas.B_CAVALO);
		setPosicao(7,2,Pecas.B_BISPO);
		setPosicao(7,4,Pecas.B_REI);
		setPosicao(7,3,Pecas.B_RAINHA);
		setPosicao(7,5,Pecas.B_BISPO);
		setPosicao(7,6,Pecas.B_CAVALO);
		setPosicao(7,7,Pecas.B_TORRE);
		for(int i=0; i<8;i++)
			setPosicao(6, i, Pecas.B_PEAO);
	}
	
	public void setPosicao(int x, int y, int valor){
		casas[x][y] = valor;
	}
	
	public int[][] getCasas() throws RemoteException{
		return casas;
	}
	
	public boolean jogoCompleto() throws RemoteException{
		return (conectados == 2);
	}
	
	public void jogar(int iMarcado, int jMarcado, int i, int j) throws RemoteException{
		if(jogadorVez == 1){
			casas[i][j] = casas[iMarcado][jMarcado];
			casas[iMarcado][jMarcado] = Pecas.VAZIO;
			jogadorVez = 2;
		}
		else if(jogadorVez == 2){
			casas[i][j] = casas[iMarcado][jMarcado];
			casas[iMarcado][jMarcado] = Pecas.VAZIO;
			jogadorVez = 1;
		}
	}
	public void jogarSemTrocarVez(int iMarcado, int jMarcado, int i, int j) throws RemoteException{
			casas[i][j] = casas[iMarcado][jMarcado];
			casas[iMarcado][jMarcado] = Pecas.VAZIO;
	}
	public void trocarPeca(int i, int j, int peca) throws RemoteException{
		casas[i][j] = peca;
	}
	
	public void notificaChequeMate() throws RemoteException{
		chequeMate = true;
	}
	
	public boolean getChequeMate() throws RemoteException{
		return chequeMate;
	}

	public void setDesistiu()throws RemoteException {
		this.desistiu = true;
			if(jogadorVez == 1){
				jogadorVez = 2;
			}
			else if(jogadorVez == 2){
				jogadorVez = 1;
			}
	}

	public boolean getDesistiu()throws RemoteException {
		return desistiu;
	}

	public void setEmpateSolicitado(boolean empateSolicitado) throws RemoteException{
		this.empateSolicitado = empateSolicitado;
		if (this.empateSolicitado){
			if(jogadorVez == 1){
				jogadorVez = 2;
			}
			else if(jogadorVez == 2){
				jogadorVez = 1;
			}
		}
	}

	public boolean getEmpateSolicitado() throws RemoteException {
		return empateSolicitado;
	}

	public void setEmpateAceito(boolean empateAceito) throws RemoteException {
		this.empateAceito = empateAceito;
		if(jogadorVez == 1){
			jogadorVez = 2;
		}
		else if(jogadorVez == 2){
			jogadorVez = 1;
		}
	}

	public boolean getEmpateAceito() throws RemoteException {
		return empateAceito;
	}
	
	
}
